﻿#include <iostream>
using namespace std;
#include "NnumCal.cpp"



int main() {
	NnumCal<int,int> nc;
	
	
}


//class Animal {
//private:
//	int pirvateNum=0;
//protected:
//	int protectedNum=0;
//public:
//	int publicNum=0;
//	Animal() :publicNum(0) {
//		cout << "无参构造" << endl;
//	}
//	Animal(int publicNum) :publicNum(publicNum) {
//		cout << "有参构造" << endl;
//	}
//};
//class Cat :public Animal {
//public:
//	Cat(){
//		cout << "Cat无参构造" << endl;
//	}
//};

//class Cat {
//public:
//    string name;
//};
//
//class Person {
//public:
//    int age;
//    int* score;
//    //Cat* cat;
//
//    Person(int a, int s) {
//        cout << "Person的有参构造函数执行了" << endl;
//        age = a;
//        score = new int(s);
//    }
//
//    Person(const Person& p) {
//        cout << "拷贝构造函数" << endl;
//        // 拷贝构造函数的默认实现，是直接进行属性值的拷贝
//        age = p.age;
//
//        // 这里不再是简简单单的值拷贝，而是在堆上创建了一个新的空间，新空间中存储原来p的score对应的值
//        // 然后将这个新的空间地址给score进行赋值
//        score = new int(*p.score);
//      /*  cat = new Cat();
//        cat->name = p.cat->name;*/
//    }
//
//    ~Person() {
//        cout << "析构函数执行了" << endl;
//        // 将score指向的堆空间销毁
//        if (score != NULL) {
//            delete score;
//            score = NULL;
//        }
//    }
//};
//
//int main() {
//    // 创建一个对象
//    Person p1(18, 99);
//    // 通过拷贝构造函数，拷贝出一个新的对象
//    Person p2(p1);
//
//    // 在刚才的拷贝构造函数中，score属性是开辟了一个新的空间的
//    // 对比两个对象的score地址，不相同的
//    cout << p1.score << endl;
//    cout << p2.score << endl;
//
//    cout << &p1.age << endl;
//    cout << &p2.age << endl;
//
//    // 对比两个对象的score指向的值，是相同的
//    cout << *p1.score << endl;
//    cout << *p2.score << endl;
//
//    // 此时程序执行结束前，p2.score指向的空间被销毁，与p1.score指向的空间没有关系
//    // 因此，p1.score在进行空间销毁的时候也就不会有任何问题
//    return 0;
//}

//class Person {
//public:
//    int age;
//    int* score;
//
//    Person() {
//        cout << "Person的无参构造函数执行了" << endl;
//    }
//
//    // 这就是Person的析构函数，析构函数只能这样书写，且不能有参数
//    // 通常在析构函数中，我们会进行一些资源的释放，例如开辟的堆中的内存
//    ~Person() {
//        cout << "Person的析构函数执行了，表示这个对象即将被销毁了" << endl;
//        if (score != NULL) {
//            delete score;  // 释放对应的堆空间
//            score = NULL;  // 释放本来存储的地址，防止野指针
//        }
//    }
//};
//int main(){
//    Person* zs = new Person();
//    //zs->score =(int*)malloc(8);
//    //*(zs->score) = 10;
//
//    zs->score = new int(10);
//    int* ss = zs->score;
//    cout << *ss << endl;
//    cout << ss << endl;
//
//    delete zs;
//
//    cout << *ss << endl;
//    cout << ss << endl;
//    return 0;
//}





//
//class Person {
//
//public:
//    //构造函数
//    Person() {
//        cout << "构造函数" << endl;
//    }
//    Person(int age, string name) {
//        Num=Num+1;
//        if (age >= 0 && age <= 150) {
//            Age = age;
//        }
//        Name = name;
//        cout << "构造函数" << endl;
//    }
//    //拷贝构造函数
//    Person(const Person& p) {
//        Name = p.Name;
//        Age = p.Age;
//    }
//
//    //析构函数
//    ~Person() {
//        cout << "析构函数" << endl;
//    }
//    int get_num() {
//
//        return Num;
//    }
//    void set_age(int age) {
//        Age = age;
//    }
//    int get_age() {
//
//        return Age;
//    }
//    void set_name(string name) {
//        Name = name;
//    }
//    string get_name() {
//        return Name;
//    }
//    void eat(string what) {
//        cout << Name << "eat" << what;
//    }
//private:
//    int Num=0;
//    int Age;
//    string Name;
//};
////class Person1 {
////public:
////    string name;
////    int age;
////    string gender;
////    int score;
////
////
////    Person1() : name("xiaobai"), age(18), gender("male"), score(99)
////    {
////        cout << "Person的无参构造函数执行了" << endl;
////    }
////
////    Person1(string n, int a, string g, int s) : name(n), age(a), gender(g), score(s)
////    {
////        cout << "Person的有参构造函数执行了" << endl;
////    }
////};
//
//void test1() {
//    //空间开辟在栈中
//    Person person=Person();
//}
//void test2() {
//    //空间开辟在堆中
//    Person* person=new Person();
//
//    delete(person);
//}
//int main()
//{
//    /*Person aa;
//    Person ss(12, "zs");
//    Person ss2(ss);
//    std::cout << ss.get_name()<<endl;
//    std::cout << ss.get_num()<<endl;
//    ss.set_name("ls");
//    std::cout << ss.get_name()<<endl*/
//    test1();
//    test2();
//    return 0;
//
//}
//
//
